/**
 * Clase que implementa el vector en 2 dimensiones para representar diferentes
 * tipos de de vectores, como posición, velocidad, aceleración, fuerza, etc.
 * @version 1
 */
public class Vector2D implements Cloneable {
   private double x, y;  // we will use cartesian coordinates
   /**
    * Constructor por defecto.
    */
   public Vector2D () {
      x = y = 0;
   }
   /**
    * Constructor del vector con coordenadas iniciales.
    * @param x coordenada X.
    * @param y Coordenada Y.
    */
   public Vector2D (double x, double y) {
      this.x = x;
      this.y = y;
   }
   /**
    * función para consultar por la coordenada X del vector.
    * @return coordenada X.
    */
   public double getX(){
      return x;
   }
   /**
    * Función para consultar por la coordenada Y del vector.
    * @return coordenada Y.
    */
   public double getY(){
      return y;
   }
   /**
    * Función para fijar las coordenadas del vector.
    * @param x coordenada X.
    * @param y coordenada Y.
    */
   public void set(double x, double y){ // to set a new position
      this.x=x;
      this.y=y;
   }
   /**
    * Función para sumar 2 vectores. Se le suma al vector actual el vector
    * indicado.
    * @param v vector a sumar.
    * @return nuevo vector con la suma.
    */
   public Vector2D plus(Vector2D v) {
      try {
         if (v==null) return (Vector2D) clone();
      } catch (CloneNotSupportedException e){
         return null;
      }
      return new Vector2D(x+v.x, y+v.y);
   }
   /**
    * Función que multiplica un vector por un escalar. se devuelve un nuevo
    * vector con el vector actual escalado por el valor indicado.
    * @param scalar factor de escalamiento.
    * @return nuevo vector con el vector escalado.
    */
   public Vector2D times(double scalar) {
      return new Vector2D(x*scalar, y*scalar);
   }
   /**
    * Función para restar 2 vectores. Se le resta al vector actual el vector
    * indicado.
    * @param v vector a restar.
    * @return 
    */
   public Vector2D minus(Vector2D v) {
      try {
         if (v==null) return (Vector2D) clone();
      } catch (CloneNotSupportedException e){
         return null;
      }
      return new Vector2D(x-v.x, y-v.y);
   }
   /**
    * Función que calcula el módulo del vector.
    * @return módulo del vector.
    */
   public double module() {
      return Math.sqrt(x*x+y*y);
   }
   /**
    * Función que entrega el vector unitario en el sentido del vector original.
    * @return vector unitario.
    */
   public Vector2D unitary() {
      return times(1/module());
   }
   /**
    * función que entrega la descripción del vector, para el encabezado.
    * @return string con el encabezado para la descripción.
    */
   public static String getDescription() {
      return "(x,y)";
   }
   /**
    * Función que entrega en un string las coordenadas del vector, referentes al
    * inicio.
    * @return string con las coordenadas. 
    */
   public String toString() {
      return x+","+y;
   }
}
   